home *** CD-ROM | disk | FTP | other *** search
/ Electronic Clipper 1995 April / Electronic Clipper 1995-04.iso / pc / pc_users / ideasrc / setup / pviewer / common.c < prev    next >
Text File  |  1992-09-26  |  13KB  |  405 lines

  1.  
  2. // ---------------------------------------------------------------------
  3. //
  4. // Common.c - Common Routines - QuickTime for Windows
  5. //
  6. //            Version 1.0
  7. //
  8. //            (c) 1988-1992 Apple Computer, Inc. All Rights Reserved.
  9. //
  10. // ---------------------------------------------------------------------
  11.  
  12.  
  13. // Includes
  14. // --------
  15.    #include <Windows.H>                // Required by Windows
  16.    #include <WindowsX.H>                // Required by Windows
  17.  
  18.    #include <dos.h>                    // Standard "C" header
  19.    #include <errno.h>                  // Standard "C" header
  20.    #include <stdarg.h>                 // Standard "C" header
  21.    #include <stdlib.h>                 // Standard "C" header
  22.    #include <stdio.h>                  // Standard "C" header
  23.  
  24.    #include "Common.H"                 // Interface to Common.C
  25.  
  26.  
  27. // Globals
  28. // -------
  29.    static struct
  30.       {char szOutOfMemory[COMMON_STRING_MAX]; // Out of memory message
  31.        WORD idNoMemMsg;                       // Non memory message id
  32.       } g;
  33.  
  34.  
  35. // Region Code Table
  36. // --------------------------------------------------------------------
  37. // Ordinal position represents corresponding Mac region code
  38. // --------------------------------------------------------------------
  39.    static char* pszRegion[] =
  40.      {
  41.       "enu", // 0
  42.       "fra", // 1
  43.       "eng", // 2
  44.       "deu", // 3
  45.       "ita", // 4
  46.       "nld", // 5
  47.       "fra", // 6
  48.       "sve", // 7
  49.       "esn", // 8
  50.       "dan", // 9
  51.       "ptg", // 10
  52.       "frc", // 11
  53.       "nor", // 12
  54.       "---", // 13
  55.       "---", // 14
  56.       "eng", // 15
  57.       "---", // 16
  58.       "fin", // 17
  59.       "fra", // 18
  60.       "deu", // 19
  61.       "---", // 20
  62.       "isl", // 21
  63.       ""     // Last entry must be NULL
  64.      };
  65.  
  66.  
  67. // Function: CommonAlloc - Allocate memory
  68. // --------------------------------------------------------------------
  69. // Parameters: LONG lBytes;            /* Number of bytes to allocate */
  70. //
  71. // Returns:    VOID FAR *pvMemory;     /* Memory block */
  72. // --------------------------------------------------------------------
  73.    VOID FAR * FAR CommonAlloc (LONG lBytes)
  74.  
  75.    // Perform simple allocation for now
  76.  
  77.      {HGLOBAL  hmem;      // Memory handle
  78.  
  79.       if( hmem = GlobalAlloc( GHND, (DWORD) lBytes ))
  80.           return GlobalLock( hmem );
  81.       else
  82.           return NULL;
  83.      }
  84.  
  85.  
  86. // Function: CommonFormatMessage - Format Message
  87. // --------------------------------------------------------------------
  88. // Parameters: HINSTANCE hResources;   /* Resource-only DLL handle */
  89. //             WORD idMsg;             /* ID of message in resource file */
  90. //             LPSTR lpszMsg;          /* Area in which to build message */
  91. //
  92. // Returns:    LPSTR lpszMsg;
  93. // --------------------------------------------------------------------
  94.    LPSTR FAR CommonFormatMessage
  95.      (HINSTANCE hResources, WORD idMsg, LPSTR lpszMsg, ...)
  96.  
  97.    // Define function data
  98.  
  99.      {char szFormat[COMMON_STRING_MAX];  // Message format
  100.       va_list pArgs;                     // String substitution arguments
  101.  
  102.    // Load the message string
  103.  
  104.       LoadString (hResources, idMsg, szFormat, sizeof (szFormat));
  105.  
  106.    // Build the message text
  107.  
  108.       va_start (pArgs, lpszMsg);
  109.       wvsprintf (lpszMsg, szFormat, (LPSTR) pArgs);
  110.       va_end (pArgs);
  111.  
  112.    // Return to caller
  113.  
  114.       return lpszMsg;
  115.  
  116.      }
  117.  
  118.  
  119. // Function: CommonFree - Free memory allocated by CommonAlloc
  120. // --------------------------------------------------------------------
  121. // Parameters: VOID FAR *pvMemory;     /* Memory to free */
  122. //
  123. // Returns:    None
  124. // --------------------------------------------------------------------
  125.    VOID FAR CommonFree (VOID FAR *pvMemory)
  126.  
  127.    // Perform simple free for now
  128.  
  129.      {HGLOBAL   hmem;              //Memory handle
  130.  
  131.       if( hmem = (HGLOBAL) LOWORD( GlobalHandle( SELECTOROF( pvMemory ))))
  132.          {GlobalUnlock( hmem );
  133.           GlobalFree( hmem );
  134.          }
  135.  
  136.       return;
  137.      }
  138.  
  139.  
  140. // Function: CommonGetDirectoryOfModule - Get Path of Module
  141. // --------------------------------------------------------------------
  142. // Parameters: HINSTANCE hInstance;      /* Application's instance handle */
  143. //             LPSTR lpPath;             /* pointer to path buffer */
  144.  
  145. // Returns:    LPSTR lpPath;
  146. // --------------------------------------------------------------------
  147.    LPSTR FAR CommonGetDirectoryOfModule (HINSTANCE hInstance, LPSTR lpPath)
  148.  
  149.      {char  szBuffer[CCHMAXPATH];       // Temporary buffer
  150.       LPSTR lpszTemp;                   // Temporary pointer
  151.  
  152.    // Clear the buffer
  153.  
  154.       szBuffer[0] = '\0';
  155.  
  156.    // Get the fully qualified .EXE name
  157.  
  158.       if (!GetModuleFileName (hInstance, szBuffer, sizeof (szBuffer)))
  159.          return (LPSTR) NULL;
  160.  
  161.    // Look backwards until we find the last backslash
  162.  
  163.       lpszTemp = szBuffer + lstrlen(szBuffer);
  164.  
  165.       while ((lpszTemp > szBuffer) && (*lpszTemp != '\\'))
  166.          lpszTemp = AnsiPrev (szBuffer, lpszTemp);
  167.       if (*lpszTemp != '\\')
  168.          return (LPSTR) NULL;
  169.  
  170.    // We delete the last backslash; we now have the path specification
  171.  
  172.       *lpszTemp = '\0';
  173.       lstrcpy (lpPath, AnsiUpper (szBuffer));
  174.  
  175.    // Return to caller
  176.  
  177.       return lpPath;
  178.  
  179.      }
  180.  
  181.  
  182. // Function: CommonGetLocalizedHelpFile - Get Help File Name
  183. // --------------------------------------------------------------------
  184. // Parameters: LPSTR lpszAppl;           /* Application's root name */
  185. //             LPSTR lpszName;           /* Area in which to build name */
  186. //             HINSTANCE hInstance;      /* Application's instance handle */
  187. //
  188. // Returns:    LPSTR pszName;
  189. // --------------------------------------------------------------------
  190.    LPSTR FAR CommonGetLocalizedHelpFile
  191.                  (LPSTR lpszAppl, LPSTR lpszName, HINSTANCE hInstance)
  192.  
  193.    // Define function data
  194.  
  195.      {char   szBuffer[CCHMAXPATH];      // Temporary buffer
  196.       char   szApplDir[CCHMAXPATH];     // Application's directory
  197.       char   szLanguage[4];             // Language code
  198.       struct _find_t  fileinfo;         // Temp file info
  199.  
  200.    // Clear the area in which the name will be built
  201.  
  202.       lpszName[0] = '\0';
  203.  
  204.    // Get the application's directory
  205.  
  206.       if (!CommonGetDirectoryOfModule (hInstance, (LPSTR) szApplDir))
  207.          return lpszName;
  208.  
  209.    // Look for the localized help file in the ..\HELP directory
  210.  
  211.       GetProfileString( "intl", "sLanguage", "enu", szLanguage, sizeof(szLanguage));
  212.       wsprintf( szBuffer, "%s\\..\\help\\%s%s.hlp",
  213.                        (LPSTR) szApplDir, (LPSTR) lpszAppl, (LPSTR) szLanguage );
  214.       if (_dos_findfirst (szBuffer, _A_NORMAL, &fileinfo) == 0)
  215.         {lstrcpy (lpszName, AnsiUpper (szBuffer));
  216.          return lpszName;
  217.         }
  218.  
  219.    // If it can't be found, look for the localized help
  220.    // file in the application's directory
  221.  
  222.       wsprintf( szBuffer, "%s\\%s%s.hlp",
  223.                      (LPSTR) szApplDir, (LPSTR) lpszAppl, (LPSTR) szLanguage );
  224.       if (_dos_findfirst (szBuffer, _A_NORMAL, &fileinfo) == 0)
  225.         {lstrcpy (lpszName, AnsiUpper (szBuffer));
  226.          return lpszName;
  227.         }
  228.  
  229.    // If it can't be found, look for the US English help
  230.    // file in the ..\HELP directory
  231.  
  232.       wsprintf( szBuffer, "%s\\..\\help\\%senu.hlp",
  233.                                          (LPSTR) szApplDir, (LPSTR) lpszAppl );
  234.       if (_dos_findfirst (szBuffer, _A_NORMAL, &fileinfo) == 0)
  235.         {lstrcpy (lpszName, AnsiUpper (szBuffer));
  236.          return lpszName;
  237.         }
  238.  
  239.    // If it can't be found, look for the US English help
  240.    // file in the application's directory
  241.  
  242.       wsprintf( szBuffer, "%s\\%senu.hlp", (LPSTR) szApplDir, (LPSTR) lpszAppl );
  243.       if (_dos_findfirst (szBuffer, _A_NORMAL, &fileinfo) == 0)
  244.         {lstrcpy (lpszName, AnsiUpper (szBuffer));
  245.          return lpszName;
  246.         }
  247.  
  248.    // Otherwise, return NULL to the caller
  249.  
  250.       return lpszName;
  251.  
  252.      }
  253.  
  254.  
  255. // Function: CommonGetLocalizedResources - Load Resource-Only DLL
  256. // --------------------------------------------------------------------
  257. // Parameters: LPSTR lpszAppl;         Application's root name
  258. //             HINSTANCE hInstance;    Application's instance handle
  259. //             WORD  idNoMemMsg;       id of no memory message
  260. //
  261. // Returns:    HINSTANCE hResource;    handle to resource instance
  262. // --------------------------------------------------------------------
  263.    HINSTANCE FAR CommonGetLocalizedResources
  264.             (LPSTR lpszAppl, HINSTANCE hInstance, WORD idNoMemMsg )
  265.  
  266.    // Define function data
  267.  
  268.      {char szBuffer[CCHMAXPATH];       // Temporary buffer
  269.       char szLanguage[4];              // Language code
  270.       LPSTR  lpszSave;                 // Temporary pointer
  271.       HINSTANCE hResources;            // Resource handle
  272.  
  273.    // Suppress DLL load warnings
  274.  
  275.       SetErrorMode (SEM_NOOPENFILEERRORBOX);
  276.  
  277.    // Get the application path
  278.  
  279.       if (!CommonGetDirectoryOfModule (hInstance, (LPSTR) szBuffer))
  280.          return NULL;
  281.  
  282.    // Build the name of the resource-only DLL
  283.  
  284.       lstrcat (szBuffer, "\\");
  285.       lstrcat (szBuffer, lpszAppl);
  286.       lpszSave = szBuffer + lstrlen(szBuffer);
  287.       GetProfileString ("intl", "sLanguage", "enu", szLanguage, sizeof (szLanguage));
  288.       lstrcat (szBuffer, szLanguage);
  289.       lstrcat (szBuffer, ".dll");
  290.       AnsiUpper (szBuffer);
  291.  
  292.    // Load the resource-only DLL. If it can't be found, use the US
  293.    // English DLL. If it can't be found, we'll use the original .EXE
  294.    // resources
  295.  
  296.       if ((hResources = LoadLibrary (szBuffer)) == 0)
  297.          return NULL;
  298.       else if (hResources < (HINSTANCE) 32)
  299.         {lstrcpy (lpszSave, "enu");
  300.          lstrcat (lpszSave, ".dll");
  301.          AnsiUpper (szBuffer);
  302.          if ((hResources = LoadLibrary (szBuffer)) == 0)
  303.             return NULL;
  304.          if (hResources < (HINSTANCE) 32)
  305.             hResources = hInstance;
  306.         }
  307.  
  308.    // Load the out of memory message
  309.  
  310.       if (idNoMemMsg > 0)
  311.         {LoadString (hResources, idNoMemMsg, g.szOutOfMemory, sizeof (g.szOutOfMemory));
  312.          g.idNoMemMsg = idNoMemMsg;
  313.         }
  314.  
  315.    // Return to the caller
  316.  
  317.       return hResources;
  318.  
  319.      }
  320.  
  321.  
  322. // Function: CommonGetCurrentRegion - Get Region Code for Current Language
  323. // --------------------------------------------------------------------
  324. // Parameters: none
  325. //
  326. // Returns:    UINT uiRegion;          Mac region code corresponding
  327. //                                     to current Windows language code
  328. // --------------------------------------------------------------------
  329.    UINT FAR CommonGetCurrentRegion (VOID)
  330.  
  331.    // Define function data
  332.  
  333.      {char   szLanguage[4];             // Language code
  334.       UINT   uiRegion;                  // Region code
  335.  
  336.    // Match Windows language code to Mac region code
  337.  
  338.       GetProfileString( "intl", "sLanguage", "enu", szLanguage, sizeof(szLanguage));
  339.       for (uiRegion = 0; *pszRegion[uiRegion]; uiRegion++)
  340.          if (lstrcmpi (szLanguage, pszRegion[uiRegion]) == 0)
  341.             break;
  342.  
  343.    // Return to the caller
  344.  
  345.       return (*pszRegion[uiRegion])? uiRegion : 0;
  346.  
  347.      }
  348.  
  349.  
  350. // Function: CommonTellUser - Issue message to User
  351. // --------------------------------------------------------------------
  352. // Parameters: HINSTANCE hResources;   /* Recource-only DLL handle */
  353. //             WORD idMsg;             /* ID of message in resource DLL */
  354. //             WORD idCaption;         /* ID of caption in resource DLL */
  355. //             WORD idStyle            /* MessageBox style flags */
  356. //
  357. // Returns:    int idReply;            /* MessageBox reply flags */
  358. // --------------------------------------------------------------------
  359.    int FAR CommonTellUser
  360.      (HINSTANCE hResources, WORD idMsg, WORD idCaption, WORD idStyle, ...)
  361.  
  362.    // Define function data
  363.  
  364.      {char szFormat[COMMON_STRING_MAX];  // Message format
  365.       char szBuffer[COMMON_STRING_MAX];  // Message buffer
  366.       char szCaption[COMMON_STRING_MAX]; // Message caption
  367.       WORD idReply;                      // Message response
  368.       va_list pArgs;                     // String substitution arguments
  369.  
  370.    // check for out of memory id
  371.  
  372.       if (g.idNoMemMsg == idMsg)
  373.         {idReply = MessageBox (NULL, g.szOutOfMemory, NULL, MB_OK | MB_SYSTEMMODAL | MB_ICONHAND );
  374.          goto endTellUser;
  375.         }
  376.  
  377.    // Load the caption string
  378.  
  379.       LoadString (hResources, idCaption, szCaption, sizeof (szCaption));
  380.  
  381.    // Load the message string
  382.  
  383.       LoadString (hResources, idMsg, szFormat, sizeof (szFormat));
  384.  
  385.    // Build the message text
  386.  
  387.       va_start (pArgs, idStyle);
  388.       wvsprintf (szBuffer, szFormat, (LPSTR) pArgs);
  389.       va_end (pArgs);
  390.  
  391.    // Display the message and capture response
  392.  
  393.       idReply = MessageBox (NULL, szBuffer, szCaption, idStyle);
  394.  
  395.    // Terminate if abort was requested
  396.  
  397.       endTellUser: if (idReply == IDABORT)
  398.          abort ();
  399.  
  400.    // Return reply
  401.  
  402.       return idReply;
  403.  
  404.      }
  405.